package sdk3
{
        import event.EventReadFileComplete;
        
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IEventDispatcher;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;
        import mx.rpc.http.HTTPService;
        import mx.rpc.xml.SimpleXMLDecoder;
        
        import sdk3.components.remoteService.readXMLconfig;

		
		/**
 		Software: c_FILE
		Version:  1.0
		Date:     2009_08_28_TIME_00:25:04
		Author:    
		LICENSE:  GNU General Public License (http://www.gnu.org/licenses/gpl.html) 	 *  	 * English: 		This program is free software; 		you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; 		either version 3 of the License, or (at your option) any later version.   		This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 		without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 		See the GNU General Public License for more details. 		You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>.   Excerpt English: Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things   		Auf Deutsch: 		Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, 		weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version. 		Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, 		sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 		Details finden Sie in der GNU General Public License. 		Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. 		Falls nicht, siehe <http://www.gnu.org/licenses/>.   Auszug Deutsch: Wenn wir von freier Software sprechen, so beziehen wir uns auf Freiheit, nicht auf den Preis. Unsere Allgemeinen Öffentlichen Lizenzen sind darauf angelegt, sicherzustellen, daß Sie die Freiheit haben, Kopien freier Software zu verbreiten (und dafür etwas zu berechnen, wenn Sie möchten), die Möglichkeit, daß Sie die Software als Quelltext erhalten oder den Quelltext auf Wunsch bekommen, daß Sie die Software ändern oder Teile davon in neuen freien Programmen verwenden dürfen und daß Sie wissen, daß Sie dies alles tun dürfen.   GNU General Public License (http://www.gnu.org/licenses/gpl.html) 	 *  	 * English: 		This program is free software; 		you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; 		either version 3 of the License, or (at your option) any later version.   		This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 		without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 		See the GNU General Public License for more details. 		You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>.   Excerpt English: Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things   		Auf Deutsch: 		Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, 		weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version. 		Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, 		sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 		Details finden Sie in der GNU General Public License. 		Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. 		Falls nicht, siehe <http://www.gnu.org/licenses/>.   Auszug Deutsch: Wenn wir von freier Software sprechen, so beziehen wir uns auf Freiheit, nicht auf den Preis. Unsere Allgemeinen Öffentlichen Lizenzen sind darauf angelegt, sicherzustellen, daß Sie die Freiheit haben, Kopien freier Software zu verbreiten (und dafür etwas zu berechnen, wenn Sie möchten), die Möglichkeit, daß Sie die Software als Quelltext erhalten oder den Quelltext auf Wunsch bekommen, daß Sie die Software ändern oder Teile davon in neuen freien Programmen verwenden dürfen und daß Sie wissen, daß Sie dies alles tun dürfen. 
		PURPOSE:
		functions for file operations on server.
		
		REQUIREMENTS TO RUN THIS:
		 
		USAGE EXAMPLE:
		
		TODO:
		
		COOL IDEAS:
		
		KNOWN BUGS:
		
		CHANGELOG:
		**/
        public class c_FILE extends EventDispatcher
        {
                public function c_FILE(target:IEventDispatcher=null)
                {
					super(target);
                }

				private static var instance:c_FILE = null;
				
				public static function singleton():c_FILE
				{
					if (instance == null) 
					{
						instance = new c_FILE();
					}
					return instance;
				}
				
                /**
                 * local stores of connection parameters:
                 * ['url']
                 * -> path and filename.php where one's endpoints script are on one's php-powered-webserver
                 * eg. http://localhost/onesproject/endpoint_method.php
                 * ['class_name']
                 * -> simply the name of the endpoint script, will be automatically generated and extracted from url when calling a service function.
                 * **/
                /** currently used Database, will be set during constructor execution **/
                public var Database:Object = {DatabaseName:'test',type:'MySQL (also not used yet)',port:'not used',usr:'not used',pwd:'not used'};

                /** currently used endpoint, will be set during constructor execution **/
                public var endpoint:Object = {url:''            ,class_name:''          ,type:''                                ,max_packet_size:null};

                /** specifies LABEL_STATUS in which the status and error messages will be written.
                 **/
                /** currently used labels, that will show service-status messages for user and eveloper (more detailed, technical output) **/
                public var USER_LABEL_STATUS:Object = {text:''};
                public var DEV_LABEL_STATUS:Object = {text:''};

                /** listdirectory:
                 * updates fileindex for this directory
                 * then reads all informations found about files in this directory and returns them as an array. **/
                var rpcResult:Array = new Array();  /** reset result array of this instance **/
                
				/**
					list directory
					takes in 3 arguments:
					path: the path to the directory
					argument1: dir,file,link
					argument2: comma seperated list of file-endings one wants to have included e.g. pdf,doc,txt
					only those files will be shown in output. if filetypes == '' all files will be included.
				 */
                /** path is the path, of which one wants informations about it's content 
                * filter is a comma separated list what kind of files one wants to see
                * default: dir,file,link **/
                public function ls(path:String,filter:String = '',filetypes:String = ''):void
                {
                	if(path != '')
                	{
                		if(filter == '')
                		{
                			filter = 'dir,file,link';
                		}
                        rpcResult = new Array();  /** reset result array of this instance **/
                        var HTTPSERVICE_LS:HTTPService = new HTTPService();

                        HTTPSERVICE_LS.method = "POST";
                        HTTPSERVICE_LS.url = endpoint['url'];
                        HTTPSERVICE_LS.useProxy=false;

						/** request **/
                        HTTPSERVICE_LS.request['operation'] = 'ls';
                        HTTPSERVICE_LS.request['path'] = path;
                        HTTPSERVICE_LS.request['argument1'] = filter;
                        HTTPSERVICE_LS.request['argument2'] = filetypes;
                        
                        HTTPSERVICE_LS.resultFormat = 'object'; // xml, array, object

                        if(HTTPSERVICE_LS.hasEventListener(ResultEvent.RESULT) == false)
                        {
                                HTTPSERVICE_LS.addEventListener(ResultEvent.RESULT, dispatch);
                        }

                        if(HTTPSERVICE_LS.hasEventListener(FaultEvent.FAULT) == false)
                        {
                                HTTPSERVICE_LS.addEventListener(FaultEvent.FAULT, dispatch);
                        }

                        HTTPSERVICE_LS.send();
                	}
                }
                
                /** leitet einfach das event weiter, sobald es auftritt **/
                public function dispatch(event:Event):void
                {
                	this.dispatchEvent(event);
                }
				
				/** the infos of the last read XMLConfigFile **/
				public var lastXMLConfigFileRead:Object = null;
				
				/** retrieves an *.xml document and tries to convert it into an more handle able object **/
				public function readXMLConfigFile(event:Event = null,fileName:String = ""):void
				{
					if(event == null)
					{
						var xml:XML;
						var loader:URLLoader = new URLLoader();
						var request:URLRequest = new URLRequest(fileName);
						loader.load(request);
						loader.addEventListener(Event.COMPLETE, readXMLConfigFile);
					}
					else
					{
						var EVENT:Event = event as Event;
						
						var loader:URLLoader = EVENT.target as URLLoader;
						if(loader != null)
						{
							xml = new XML(loader.data);
							var c_XML_inst:c_XML = new c_XML();
							var OBJECT:Object = c_XML_inst.XMLDocument_TO_OBJECT(xml);
							
							this.lastXMLConfigFileRead = OBJECT;
							this.dispatch(new EventReadFileComplete("EventReadFileComplete",OBJECT));
						}
					}
				}				
        }
}